MTB Categorization Analysis

Introduction

For this project, our team will determine whether the specifications of mountain bikes (MTB) are enough to differentiate between the different types of mountain bike categories.

Currently, full suspension mountain bikes come in multiple categories:

  • Cross Country (XC) | Tend to be the most lightweight, nimble, and designed to put the rider in an efficient pedaling position
  • Enduro | Heavier frames, more travel and more downhill oriented geometry
  • Trail | The most common category of bikes, considered to be the halfway point between XC and Enduro
  • All Mountain | A more niche category which some manufacturers claim to be more downhill focused than trail bikes, but not designed for downhill races like Enduro bikes are
  • Downcountry | A relatively new category between XC and Trail. Similar to the All Mountain category, these bikes aren’t race specific like XC bikes tend to be, but are lighter and faster than trail bikes.

With all of the factors to consider when designing a bike, there are no clear boundaries between these categories. For example, one brand’s Downcountry bike could be what another brand considers a Trail bike.

The goal of our project is to determine how many, if any, discrete categories should exist for mountain bikes. Since most specifications and geometric measurements have one direction when moving across the spectrum of bikes, it’s reasonable to believe that these measurements could be reduced to much fewer dimensions, and perhaps even one continuous principle component rather than discrete categories. Here is a diagram of some of the different types of geometric specifications on mountain bikes:

Various Dimension Features of a Bike’s Geometry

Let’s start by taking a look at the data.

# Read in sheet 2 of our data
mtb_data <- read_excel(here::here('Data/mtb_stats.xlsx'), 'Sheet1')
mtb_data <- mtb_data %>% 
  # Clean up the label column
  mutate(label = str_replace_all(str_to_lower(label), '[:punct:]', ''))

# Pull out the class labels
labels <- mtb_data %>% 
  select(label)


# Let's view the mtb_data output
# In any kable outputs, display NAs as blanks
opts <- options(knitr.kable.NA = "")

mtb_data %>% 
  head(25) %>%
  # Fix up the headers by replacing the underscores with spaces
  rename_all(funs(str_replace_all(., "_", " "))) %>% 
  # Make everything proper capitalization
  # rename_all(funs(str_to_title)) %>% 
  kable() %>%
  kable_styling(bootstrap_options = c("striped", "hover"),
                full_width = F,
                font_size = 12) %>%
  # Make the header row bold and black so it's easier to read
  row_spec(0, bold = T, color = "black") %>% 
  scroll_box(height = "400px", width = "100%")
model brand build type price url image setting size used label rear travel fork travel f piston f rotor dim r piston r rotor dim head angle seat angle crank length stem length handlebar width reach stack wheelbase chainstay length bb height standover height
habit cannondale L tr 130 140 4 180 4 180 66.0 74.5 780 460.0 625.0 1210.0 435.0 339.0 770.0
scalpel cannondale L xc 100 100 2 160 2 160 68.0 74.5 80 760 435.0 601.0 1175.0 436.0 331.0 745.0
scalpel se cannondale L dc 120 120 2 160 2 160 67.0 74.0 780 450.0 611.0 1172.0 436.0 344.0 758.0
reign advanced pro giant L en 146 170 4 203 4 203 64.6 76.4 40 800 488.0 631.0 1262.0 439.0 781.0
trance advanced X pro giant high L tr 135 150 4 203 4 180 66.2 77.9 50 800 494.0 624.0 1238.0 435.0 761.0
trance advanced X pro giant low L tr 135 150 4 203 4 180 65.5 77.2 50 800 486.0 631.0 1239.0 438.0 752.0
anthem advanced pro giant L xc 90 100 2 180 2 160 69.0 73.5 80 780 454.0 594.0 1154.0 438.0 817.0
jet 9 rdo niner high M tr 120 130 4 180 4 180 66.5 76.0 40 800 450.0 613.0 1179.0 430.0 698.0
jet 9 rdo niner low M tr 120 130 4 180 4 180 66.0 75.5 40 800 444.0 617.0 1180.0 432.0 705.0
rip 0 rdo niner high M tr 140 150 4 180 4 180 66.0 75.8 800 440.0 615.0 1181.0 435.0 712.0
rip 0 rdo niner low M tr 140 150 4 180 4 180 65.0 75.2 800 433.0 619.0 1182.0 435.0 705.0
rkt 9 rdo niner M dc 90 120 4 180 4 160 70.0 73.5 780 413.0 617.0 1111.0 439.0 739.0
rkt 9 rdo rs niner M xc 90 100 4 180 4 160 71.0 74.5 780 424.0 600.0 1103.0 439.0 728.0
megatower santa cruz L en 160 160 4 200 4 200 65.0 76.6 470.0 625.0 1231.0 435.0 343.0 713.0
tallboy santa cruz L tr 120 130 4 180 4 180 65.7 76.4 50 800 470.0 619.0 1211.0 430.0 335.0 706.0
hightower santa cruz L tr 145 150 4 180 4 180 65.5 76.8 50 780 473.0 619.0 1231.0 433.0 344.0 717.0
blur santa cruz L xc 100 100 2 160 2 160 69.0 74.0 750 460.0 598.0 1160.0 432.0 328.0 723.0
blur tr santa cruz L dc 115 120 2 180 2 180 67.1 74.9 175 60 760 457.5 606.5 1183.2 435.8 339.6 745.4
ransom scott L/29 en 170 170 4 203 4 180 64.5 75.0 50 800 466.5 627.6 1249.2 437.9 353.0 760.9
spark scott L tr 120 130 4 180 4 180 67.2 73.8 70 760 460.0 602.4 1182.8 438.0 327.0 778.0
genius scott high L tr 150 150 4 203 4 180 65.6 75.3 50 780 472.0 609.2 1230.8 436.0 340.0 749.5
genius scott low L tr 150 150 4 203 4 180 65.0 74.8 50 780 466.1 613.7 1232.1 438.0 345.9 758.4
spark rc scott L xc 100 110 2 180 2 160 68.5 73.8 80 740 456.8 596.2 1158.6 435.0 319.5 756.0
epic evo specialized high m dc 110 120 4 180 4 160 67.0 74.5 175 60 760 436.0 597.0 1164.0 438.0 339.0 781.0
epic evo specialized low m dc 110 120 4 180 4 160 66.5 74.5 175 60 760 436.0 597.0 1164.0 438.0 336.0 781.0

EDA

DataExplorer::plot_bar(mtb_data, 
                       ggtheme = theme_classic(),
                       title = 'Distribution of Categorical Demographic Variables',
                       theme_config = theme(plot.title = element_text(hjust = 0, 
                                                                          color = "slateblue4", 
                                                                          size = 24),
                                                plot.subtitle = element_text(hjust = 0, color = "slateblue2", size = 10),
                                                plot.caption = element_text(color = "dark gray", size = 10, face = "italic"),
                                                axis.title.x = element_text(size = 14),
                                                axis.title.y = element_text(size = 14)),
                       maxcat = 10,
                       ncol = 2)

DataExplorer::plot_density(mtb_data,
                             ggtheme = theme_classic(),
                             title = 'Distribution of Continuous Demographic Variables',
                             geom_density_args = list(fill = 'slateblue'),
                             theme_config = theme(plot.title = element_text(hjust = 0, 
                                                                                color = "slateblue4", 
                                                                                size = 24),
                                                      plot.subtitle = element_text(hjust = 0, color = "slateblue2", size = 10),
                                                      plot.caption = element_text(color = "dark gray", size = 10, face = "italic"),
                                                      axis.title.x = element_text(size = 14),
                                                      axis.title.y = element_text(size = 14)),
                             ncol = 3)

Average bikes by flip-chip setting

# Split data based on setting vs. no setting
no_setting <- mtb_data %>% 
  filter(is.na(setting))
setting <- mtb_data %>% 
  filter(!is.na(setting))



setting <- cbind(setting$model, setting$label, select_if(setting, is.numeric))
setting$model <- setting$`setting$model`
setting <- setting %>% select(-`setting$model`)
setting$label <- setting$`setting$label`
setting <- setting %>% select(-`setting$label`)

mean_by_setting <- aggregate(x=select(setting, -c(model, label)),
                             by=list(setting$model, setting$label),
                             FUN=mean)
mean_by_setting$model <- mean_by_setting$Group.1
mean_by_setting$label <- mean_by_setting$Group.2
mean_by_setting <- mean_by_setting %>% select(-c(Group.1, Group.2))

no_setting <- cbind(no_setting$model, no_setting$label, select_if(no_setting, is.numeric))
no_setting$model <- no_setting$`no_setting$model`
no_setting <- no_setting %>% select(-`no_setting$model`)
no_setting$label <- no_setting$`no_setting$label`
no_setting <- no_setting %>% select(-`no_setting$label`)

new_mtb_data <- data.frame(rbind(mean_by_setting, no_setting))

rownames(new_mtb_data) <- new_mtb_data$model

Variation Amongst Featureset

The first thing we’ll do is look to see if any of the features in our dataset are better at explaining the variation amongst the different bikes than other features. That is, it’s completely possible that two features are similar and don’t have much variation in them, even across some of the different bike categories. To do so, we’ll:

  1. Look for highly correlated features and flag these for potential removal;
  2. Run Principal Component Analysis (PCA) to see if certain features are better at explaining the variation in our data better than others.

1. Correlation

First, let’s take a look at our most highly correlated features. We’ll use the corrplot() function to better order the highly correlated features by the angular order of their eigenvectors.

mtb_correlation <- mtb_data %>% 
  # Get rid of price for now
  select(-price) %>% 
  # Select our variables of interest
  select_if(is.numeric) %>% 
  # Remove rows with NAs in them
  # drop_na() %>% 
  # Build our correlation matrix, such that missing values are handled by casewise deletion
  cor(use = 'complete.obs') 

# Convert our results into a tibble for easier manipulation
mtb_correlation_df <- mtb_correlation %>% 
  as_tibble() %>% 
  mutate(variable = colnames(mtb_correlation)) %>% 
  relocate(variable, everything())

# Build our correlation plot, using the angular order of the eigenvectors
corrplot(mtb_correlation,
         diag = F,
         col = COL2('PRGn'),
         tl.col = 'slateblue4',
         type = 'lower',
         method = 'color',
         order = 'AOE',
         title = 'Mountain Bike Feature Correlation'
         )

Here we see some obvious correlations, for example:
- f_piston (front brakes) is perfectly correlated with r_piston (rear brakes), which makes sense since mountain bikes tend to use the same types/spec of brakes for the front vs. rear tires.
- fork_travel has a correlation above .95 with: fork_travel. This make sense; for example, rear_travel should be highly correlated with fork_travel.

In all, here are the most highly correlated variables (i.e. variables which have a correlation above .95 or below -.95):

mtb_correlation_df %>% 
  pivot_longer(-variable, 
               names_to = 'correlated_variable', 
               values_to = 'correlation') %>% 
  filter(variable != correlated_variable) %>% 
  filter((correlation > .95) | (correlation < -.95)) %>% 
  pander()
variable correlated_variable correlation
f_piston r_piston 1
r_piston f_piston 1
seat_angle stem_length -0.9506
stem_length seat_angle -0.9506
stack wheelbase 0.9512
wheelbase stack 0.9512

For now, we’ll opt to include everything. But later on, as we analyze the importance of different features, we’ll look to remove some of the above variables first.

2. PCA

Next, we’ll apply PCA to our dataset. In so doing, we’ll have to center and scale our data given how different the ranges are for certain measurements. Let’s take a look at our 5 principal components which explain the largest proportion of variance in the data:

# Impute missing values with column mean (not really best practice, but good enough)
for (c in 1:ncol(new_mtb_data)){
  if (is.numeric(unlist(new_mtb_data[,c]))){
    # print(colnames(new_mtb_data)[c])
    new_mtb_data[is.na(new_mtb_data[,c]), c] <- mean(unlist(new_mtb_data[,c]), na.rm=TRUE)  
  }
}

# TODO get average bikes by setting  to work above
mtb_no_null <- new_mtb_data %>% 
                select(-price) %>%
                select_if(is.numeric) %>% 
                bind_cols(label = new_mtb_data$label) %>%
                drop_na()


# head(mtb_no_null)


mtb_pca <- prcomp(mtb_no_null %>% select(-label),
                  center = TRUE,
                  scale. = TRUE)

# Put our summary results into a dataframe
mtb_pca_df <- tibble(variable = c('Standard Deviation', 'Proportion of Variance', 'Cumulative Proportion')) %>% 
  cbind(summary(mtb_pca)$importance)


# head(mtb_pca_df)

mtb_pca_df %>% 
  # Only display the first 6 columns
  select(c(variable:PC5)) %>% 
  pander()
Table continues below
  variable PC1 PC2
Standard deviation Standard Deviation 2.972 1.301
Proportion of Variance Proportion of Variance 0.5194 0.09957
Cumulative Proportion Cumulative Proportion 0.5194 0.619
  PC3 PC4 PC5
Standard deviation 1.211 1.089 0.8863
Proportion of Variance 0.0862 0.06972 0.0462
Cumulative Proportion 0.7052 0.7749 0.8211

We can see that, actually, starting at our \(5^{\text{rd}}\) principal component, nearly 82.1% of the data’s variation is properly explained. Let’s take a look at our top 2 principal components:

p_load(devtools,
       ggbiplot)

ggbiplot(mtb_pca,
              obs.scale = 1,
              var.scale = 1,
              groups = mtb_no_null$label,
              ellipse = TRUE,
              circle = FALSE,
              ellipse.prob = .5) + 
  theme(legend.direction = 'horizontal',
               legend.position = 'top')

# jpeg('../Images/pca.jpg')

Here we can see that our top 2 principal components, which explain roughly 61.9% of the variation in our data, are already pretty good representations for describing the different components in our dataset. Even so, the groupings are distinctly plotted on the 2-D graph.

Rowdiness scale

Clustering

K-Means

# How many clusters are necessary? 4
mtb_numeric <- mtb_no_null %>% 
  select(-label)

clusters <- 1:10
dists <- c()
for (c in 1:10){
  km <- kmeans(mtb_numeric, centers=c, iter.max=1000)
  dists <- c(dists, km$tot.withinss)
}

# jpeg('../Images/Kmeans.jpg')
# plot(clusters, dists, type='l', xlab='Clusters', ylab='Total Sum of Squared Euclidean Distances')

# Plot our results
tibble(clusters = clusters,
       dists = dists) %>% 
  ggplot(aes(x = clusters, y = dists)) + 
  geom_point(size = 3, alpha = .9, color = 'slateblue') +
  geom_line(size = 2, alpha = 1, color = 'slateblue1') + 
  labs(title = "K-Means Clustering of MTB Data",
       subtitle = 'Method uses `tot.withinss` parameter to measure distances.',
       x = 'Clusters',
       y = 'Total Sum of Squared Euclidean Distances')

# Let's see where these clusters would end up on the 2D PCA plot

mtb_standard_scaled <- scale(mtb_numeric)
mtb_pca_scaled <- prcomp(mtb_standard_scaled,
                  center = F,
                  scale. = F)

pca_2_scaled <- as.matrix(mtb_standard_scaled) %*% as.matrix(mtb_pca_scaled$rotation[,1:2])

pca_km_scaled <- kmeans(pca_2_scaled, centers=4, iter.max=1000)

#Something's not working here, definitely hitting a local min or something
colorgroups <- function(g){
  if (g == 'tr' || g == 'Trail'){
    return('blue')
  }
  else if (g == 'xc' || g == 'Cross Country'){
    return('pink')
  }
  else if (g == 'dc' || g == 'Downcountry'){
    return('darkgoldenrod3')
  }
  else if (g == 'am' || g == 'All Mountain'){
    return('red')
  }
  else if (g == 'en' || g == 'Enduro'){
    return('green')
  }
}
catNames <- c('Cross Country', 'Downcountry', 'Trail', 'All Mountain', 'Enduro')
cols <- unlist(lapply(new_mtb_data$label, colorgroups))
unlist(lapply(catNames, colorgroups))
## [1] "pink"           "darkgoldenrod3" "blue"           "red"           
## [5] "green"
# jpeg('../Images/PCA_clusters.jpg')
plot(pca_2_scaled, col=cols)
points(pca_km_scaled$centers, col = 'slateblue4', pch = 'x', cex = 1.5)
# text(pca_2_scaled[,1], pca_2_scaled[,2], rownames(pca_2_scaled))
legend("bottomleft", legend= c(catNames, 'Cluster Center'), col=c(unlist(lapply(catNames, colorgroups)), 'black'), pch=c(rep('o', 5), 'X'))

#TODO let's look at this bottom cluster - both Niner bikes

#Based on PCA mapping, the blur tr, expic, Exie, Ripley, and Element all have less chainstay length, and less pistons?? wow, should we exclude piston count?? with more 2 piston bikes getting added, it evens out the average, so these aren't showing up as much anymore
?points()
#Niner has low reach numbers on its bikes - could be because we used the Medium for these!

Gaussian Mixture Model (GMM)

In this section, we’ll take a more probabilistic model to our clustering. That is, we’ll use a Guassian Mixture Model (GMM) to build out normally distributed subgroupings within our mountain bike dataset, where the densities of each of the subgroupings represents a probability that a bike belongs to that subgrouping. Unlike K-Means, which is a more centroid-based clustering method, GMM is more of a distribution-based clustering method.

p_load(ClusterR)

# Build our GMM model
mtb_gmm <- GMM(mtb_standard_scaled,
               dist_mode = 'eucl_dist', # Distance metric to use during seeding of initial means clustering
               seed_mode = 'random_subset', # How initial means are seeded prior to EM alg
               km_iter = 10, # Num of iterations of K-Means alg
               em_iter = 10, # Num of iterations of EM alg
               verbose = T
               )
## gmm_diag::learn(): generating initial means
## gmm_diag::learn(): k-means: n_threads: 1
## gmm_diag::learn(): k-means: iteration:    1   delta: 5.7245
## gmm_diag::learn(): k-means: iteration:    2   delta: 6.42421e-34
## gmm_diag::learn(): generating initial covariances
## gmm_diag::learn(): EM: n_threads: 1
## gmm_diag::learn(): EM: iteration:    1   avg_log_p: -23.9741
## gmm_diag::learn(): EM: iteration:    2   avg_log_p: -23.9741
## 
## time to complete : 6.6333e-05
mtb_gmm_pred <- predict(mtb_gmm, mtb_standard_scaled)

opt_gmm <- Optimal_Clusters_GMM(mtb_standard_scaled, 
                               max_clusters = 20, 
                               criterion = "BIC", 
                               dist_mode = "eucl_dist", 
                               seed_mode = "random_subset",
                               km_iter = 10, 
                               em_iter = 10, 
                               var_floor = 1e-10, 
                               plot_data = T)

Use the mclust package in R, which utilizes Bayesian Information Criterion (BIC) to optimize the number of clusters.

p_load(mclust)

mtb_gmm2 <- Mclust(mtb_standard_scaled)

#or specify number of clusters
# mb3 = Mclust(iris[,-5], 3)

# optimal selected model
mtb_gmm2$modelName
## [1] "XXX"
# optimal number of cluster
mtb_gmm2$G
## [1] 1
# probality for an observation to be in a given cluster
head(mtb_gmm2)
## $call
## Mclust(data = mtb_standard_scaled)
## 
## $data
##                                    rear_travel fork_travel
## epic evo              -0.818794010628987378730  -0.8022342
## top fuel 9.9 xx1 axs  -0.592716432664201264835  -0.8022342
## Altitude               1.441981769018874093291   1.4649495
## enduro                 1.894136924948446543127   1.4649495
## Firebird               1.668059346983660207187   1.4649495
## rallon                -0.000000000000001285102   0.0000000
## slash                  1.441981769018874093291   1.4649495
## Switchblade           -0.000000000000001285102   1.0115127
## fuel ex 9.9            0.085516301230157229507   0.1046392
## genius                 0.989826613089301865500   0.5580760
## instinct               0.537671457159729526687   0.5580760
## jet 9 rdo             -0.366638854699415095428  -0.3487975
## rip 0 rdo              0.537671457159729526687   0.5580760
## stumpjumper            0.085516301230157229507   0.1046392
## Trail 429             -0.000000000000001285102  -0.3487975
## trance advanced X pro  0.311593879194943412791   0.5580760
## element               -0.366638854699415095428  -0.3487975
## habit                  0.085516301230157229507   0.1046392
## scalpel               -1.270949166558559717544  -1.7091077
## scalpel se            -0.366638854699415095428  -0.8022342
## reign advanced pro     0.808964550717472974384   1.4649495
## anthem advanced pro   -1.723104322488131945335  -1.7091077
## rkt 9 rdo             -1.723104322488131945335  -0.8022342
## rkt 9 rdo rs          -1.723104322488131945335  -1.7091077
## megatower              1.441981769018874093291   1.0115127
## tallboy               -0.366638854699415095428  -0.3487975
## hightower              0.763749035124515640582   0.5580760
## blur                  -1.270949166558559717544  -1.7091077
## blur tr               -0.592716432664201264835  -0.8022342
## ransom                 1.894136924948446543127   1.4649495
## spark                 -0.366638854699415095428  -0.3487975
## spark rc              -1.270949166558559717544  -1.2556710
## stumpjumper evo        0.989826613089301865500   1.0115127
## epic                  -1.270949166558559717544  -1.7091077
## supercaliber          -3.079569790276849072796  -1.7091077
## sb115                 -0.592716432664201264835  -0.3487975
## sb150                  0.989826613089301865500   1.4649495
## sb130                  0.085516301230157229507   0.5580760
## jeffsy                -0.000000000000001285102   0.5580760
## izzo                  -0.000000000000001285102  -0.8022342
## Capra                 -0.000000000000001285102   1.4649495
## revolver              -0.366638854699415095428  -0.8022342
## optic                 -0.140561276734628926022   0.1046392
## sight                  0.989826613089301865500   1.0115127
## range                  1.894136924948446543127   1.4649495
## spur                  -0.366638854699415095428  -0.8022342
## sentinel               0.989826613089301865500   1.0115127
## Spire                 -0.000000000000001285102   0.0000000
## Patrol                -0.000000000000001285102   0.0000000
## ranger                -0.592716432664201264835  -0.8022342
## rascal                 0.085516301230157229507   0.1046392
## rail                  -0.000000000000001285102   0.0000000
## Exie                  -1.270949166558559717544  -0.8022342
## Ripmo                  0.854180066310430197163   1.0115127
## Ripley                -0.366638854699415095428  -0.3487975
## Mach 4 SL             -0.000000000000001285102  -1.7091077
## oiz                   -0.000000000000001285102   0.0000000
## occam                 -0.000000000000001285102   0.0000000
##                                       f_piston f_rotor_dim
## epic evo               0.805960699769317390206  -0.5212351
## top fuel 9.9 xx1 axs  -0.000000000000001163235  -0.5212351
## Altitude              -0.000000000000001163235   0.0000000
## enduro                 0.805960699769317390206   2.6271647
## Firebird               0.805960699769317390206   1.2890948
## rallon                -0.000000000000001163235   0.0000000
## slash                  0.805960699769317390206   1.2890948
## Switchblade            0.805960699769317390206   1.0529648
## fuel ex 9.9           -0.000000000000001163235   1.0529648
## genius                 0.805960699769317390206   1.2890948
## instinct              -0.000000000000001163235   0.0000000
## jet 9 rdo              0.805960699769317390206  -0.5212351
## rip 0 rdo              0.805960699769317390206  -0.5212351
## stumpjumper            0.805960699769317390206   1.0529648
## Trail 429              0.805960699769317390206  -0.5212351
## trance advanced X pro  0.805960699769317390206   1.2890948
## element               -1.813411574480967791700  -0.5212351
## habit                  0.805960699769317390206  -0.5212351
## scalpel               -1.813411574480967791700  -2.0954349
## scalpel se            -1.813411574480967791700  -2.0954349
## reign advanced pro     0.805960699769317390206   1.2890948
## anthem advanced pro   -1.813411574480967791700  -0.5212351
## rkt 9 rdo              0.805960699769317390206  -0.5212351
## rkt 9 rdo rs           0.805960699769317390206  -0.5212351
## megatower              0.805960699769317390206   1.0529648
## tallboy                0.805960699769317390206  -0.5212351
## hightower              0.805960699769317390206  -0.5212351
## blur                  -1.813411574480967791700  -2.0954349
## blur tr               -1.813411574480967791700  -0.5212351
## ransom                 0.805960699769317390206   1.2890948
## spark                  0.805960699769317390206  -0.5212351
## spark rc              -1.813411574480967791700  -0.5212351
## stumpjumper evo        0.805960699769317390206   1.0529648
## epic                  -1.813411574480967791700   0.0000000
## supercaliber          -1.813411574480967791700  -2.0954349
## sb115                  0.805960699769317390206  -0.5212351
## sb150                 -0.000000000000001163235   1.0529648
## sb130                 -0.000000000000001163235   1.0529648
## jeffsy                -0.000000000000001163235   0.0000000
## izzo                  -0.000000000000001163235   0.0000000
## Capra                 -0.000000000000001163235   0.0000000
## revolver              -0.000000000000001163235  -0.5212351
## optic                  0.805960699769317390206  -0.5212351
## sight                  0.805960699769317390206   1.0529648
## range                 -0.000000000000001163235   1.0529648
## spur                   0.805960699769317390206  -0.5212351
## sentinel               0.805960699769317390206   1.0529648
## Spire                 -0.000000000000001163235   0.0000000
## Patrol                -0.000000000000001163235   0.0000000
## ranger                -0.000000000000001163235  -0.5212351
## rascal                -0.000000000000001163235   0.0000000
## rail                  -0.000000000000001163235   0.0000000
## Exie                  -1.813411574480967791700  -0.5212351
## Ripmo                  0.805960699769317390206   1.0529648
## Ripley                -1.813411574480967791700  -0.5212351
## Mach 4 SL             -1.813411574480967791700  -2.0954349
## oiz                   -0.000000000000001163235   0.0000000
## occam                 -0.000000000000001163235   0.0000000
##                                       r_piston              r_rotor_dim
## epic evo               0.805960699769317390206 -1.298116464681194015540
## top fuel 9.9 xx1 axs  -0.000000000000001163235 -1.298116464681194015540
## Altitude              -0.000000000000001163235 -0.000000000000004286898
## enduro                 0.805960699769317390206  1.718520066345551322584
## Firebird               0.805960699769317390206  1.944767806172557289557
## rallon                -0.000000000000001163235 -0.000000000000004286898
## slash                  0.805960699769317390206  1.944767806172557289557
## Switchblade            0.805960699769317390206  0.210201800832178736789
## fuel ex 9.9           -0.000000000000001163235  0.210201800832178736789
## genius                 0.805960699769317390206  0.210201800832178736789
## instinct              -0.000000000000001163235 -0.000000000000004286898
## jet 9 rdo              0.805960699769317390206  0.210201800832178736789
## rip 0 rdo              0.805960699769317390206  0.210201800832178736789
## stumpjumper            0.805960699769317390206  0.210201800832178736789
## Trail 429              0.805960699769317390206  0.210201800832178736789
## trance advanced X pro  0.805960699769317390206  0.210201800832178736789
## element               -1.813411574480967791700  0.210201800832178736789
## habit                  0.805960699769317390206  0.210201800832178736789
## scalpel               -1.813411574480967791700 -1.298116464681194015540
## scalpel se            -1.813411574480967791700 -1.298116464681194015540
## reign advanced pro     0.805960699769317390206  1.944767806172557289557
## anthem advanced pro   -1.813411574480967791700 -1.298116464681194015540
## rkt 9 rdo              0.805960699769317390206 -1.298116464681194015540
## rkt 9 rdo rs           0.805960699769317390206 -1.298116464681194015540
## megatower              0.805960699769317390206  1.718520066345551322584
## tallboy                0.805960699769317390206  0.210201800832178736789
## hightower              0.805960699769317390206  0.210201800832178736789
## blur                  -1.813411574480967791700 -1.298116464681194015540
## blur tr               -1.813411574480967791700  0.210201800832178736789
## ransom                 0.805960699769317390206  0.210201800832178736789
## spark                  0.805960699769317390206  0.210201800832178736789
## spark rc              -1.813411574480967791700 -1.298116464681194015540
## stumpjumper evo        0.805960699769317390206  1.718520066345551322584
## epic                  -1.813411574480967791700 -0.000000000000004286898
## supercaliber          -1.813411574480967791700 -1.298116464681194015540
## sb115                  0.805960699769317390206 -1.298116464681194015540
## sb150                 -0.000000000000001163235  1.718520066345551322584
## sb130                 -0.000000000000001163235  0.210201800832178736789
## jeffsy                -0.000000000000001163235 -0.000000000000004286898
## izzo                  -0.000000000000001163235 -0.000000000000004286898
## Capra                 -0.000000000000001163235 -0.000000000000004286898
## revolver              -0.000000000000001163235 -1.298116464681194015540
## optic                  0.805960699769317390206  0.210201800832178736789
## sight                  0.805960699769317390206  0.210201800832178736789
## range                 -0.000000000000001163235  1.718520066345551322584
## spur                   0.805960699769317390206 -1.298116464681194015540
## sentinel               0.805960699769317390206  1.718520066345551322584
## Spire                 -0.000000000000001163235 -0.000000000000004286898
## Patrol                -0.000000000000001163235 -0.000000000000004286898
## ranger                -0.000000000000001163235 -1.298116464681194015540
## rascal                -0.000000000000001163235  0.210201800832178736789
## rail                  -0.000000000000001163235  0.210201800832178736789
## Exie                  -1.813411574480967791700 -1.298116464681194015540
## Ripmo                  0.805960699769317390206  0.210201800832178736789
## Ripley                -1.813411574480967791700  0.210201800832178736789
## Mach 4 SL             -1.813411574480967791700 -1.298116464681194015540
## oiz                   -0.000000000000001163235 -0.000000000000004286898
## occam                 -0.000000000000001163235 -0.000000000000004286898
##                        head_angle seat_angle             crank_length
## epic evo               0.33491241 -1.0223855 -0.051950588412103558544
## top fuel 9.9 xx1 axs   0.91736878 -0.3833946 -0.051950588412103558544
## Altitude              -0.80087751  0.0851988 -0.441580001502869190499
## enduro                -1.20859697  0.2555964 -0.441580001502869190499
## Firebird              -0.91736878  1.5335783 -0.000000000000002214787
## rallon                -1.12122851  1.3205813 -0.441580001502869190499
## slash                 -1.06298288  0.1277982 -0.000000000000002214787
## Switchblade            0.04368423  0.0425994 -0.000000000000002214787
## fuel ex 9.9            0.04368423 -0.3833946 -0.051950588412103558544
## genius                -0.50964932 -0.5537922 -0.000000000000002214787
## instinct              -0.39315805  0.6815904 -0.441580001502869190499
## jet 9 rdo              0.04368423  0.0425994 -0.000000000000002214787
## rip 0 rdo             -0.39315805 -0.1703976 -0.000000000000002214787
## stumpjumper           -0.53877214  0.4685934 -0.441580001502869190499
## Trail 429              0.04368423 -0.3833946 -0.000000000000002214787
## trance advanced X pro -0.18929832  1.5761777 -0.000000000000002214787
## element               -0.39315805  0.6815904 -0.441580001502869190499
## habit                 -0.10192986 -1.0223855 -0.000000000000002214787
## scalpel                1.06298288 -1.0223855 -0.000000000000002214787
## scalpel se             0.48052651 -1.4483795 -0.000000000000002214787
## reign advanced pro    -0.91736878  0.5963916 -0.000000000000002214787
## anthem advanced pro    1.64543925 -1.8743735 -0.000000000000002214787
## rkt 9 rdo              2.22789562 -1.8743735 -0.000000000000002214787
## rkt 9 rdo rs           2.81035199 -1.0223855 -0.000000000000002214787
## megatower             -0.68438624  0.7667892 -0.000000000000002214787
## tallboy               -0.27666678  0.5963916 -0.000000000000002214787
## hightower             -0.39315805  0.9371868 -0.000000000000002214787
## blur                   1.64543925 -1.4483795 -0.000000000000002214787
## blur tr                0.53877214 -0.6815904 -0.051950588412103558544
## ransom                -0.97561442 -0.5963916 -0.000000000000002214787
## spark                  0.59701778 -1.6187771 -0.000000000000002214787
## spark rc               1.35421106 -1.6187771 -0.000000000000002214787
## stumpjumper evo       -1.84929898  1.0223855 -0.441580001502869190499
## epic                   0.77175469 -0.1703976 -0.051950588412103558544
## supercaliber           1.64543925 -1.4483795 -0.051950588412103558544
## sb115                  0.83000033 -1.3631807 -0.000000000000002214787
## sb150                 -0.97561442  1.1075843 -0.000000000000002214787
## sb130                 -0.39315805  1.1075843 -0.000000000000002214787
## jeffsy                -0.10192986  1.1075843 -0.051950588412103558544
## izzo                   0.18929832  1.5335783 -0.441580001502869190499
## Capra                 -1.15035133  1.6187771 -0.441580001502869190499
## revolver               0.71350905 -0.6815904 -0.051950588412103558544
## optic                 -0.68438624  0.2555964 -0.441580001502869190499
## sight                 -1.55807079  1.7039759 -0.441580001502869190499
## range                 -1.70368488  1.1075843 -0.441580001502869190499
## spur                  -0.10192986  0.4259940 -0.051950588412103558544
## sentinel              -1.49982515  1.5335783 -0.441580001502869190499
## Spire                  0.00000000  0.0000000 -0.000000000000002214787
## Patrol                 0.00000000  0.0000000 -0.000000000000002214787
## ranger                 0.77175469 -0.3407952 -0.441580001502869190499
## rascal                -0.10192986 -0.5963916 -0.441580001502869190499
## rail                  -0.68438624  0.2555964  7.351008260312443809426
## Exie                   0.59701778 -0.7667892 -0.051950588412103558544
## Ripmo                 -0.74263187  0.2555964 -0.051950588412103558544
## Ripley                 0.21842114  0.2555964 -0.051950588412103558544
## Mach 4 SL              1.35421106 -1.0223855 -0.000000000000002214787
## oiz                    1.64543925 -0.5963916 -0.051950588412103558544
## occam                 -0.10192986  1.1075843 -0.051950588412103558544
##                       stem_length          handlebar_width       reach
## epic evo                0.7646571 -1.131757071994477614751 -1.61124668
## top fuel 9.9 xx1 axs    0.7646571 -1.659270961483430895100 -0.27291210
## Altitude               -1.2301005 -0.076729293016571206709  0.88697786
## enduro                 -0.2327217  0.978298485961335284600  0.00000000
## Firebird                0.0000000  0.978298485961335284600  1.63049707
## rallon                 -0.2327217  0.978298485961335284600  1.30334862
## slash                  -0.2327217  2.033326264939241845298  0.50034787
## Switchblade             0.0000000 -0.076729293016571206709  0.55982941
## fuel ex 9.9            -0.7314111 -0.076729293016571206709 -0.33239364
## genius                 -0.2327217 -0.076729293016571206709  0.35461811
## instinct               -1.2301005 -0.076729293016571206709 -1.67072822
## jet 9 rdo              -1.2301005  0.978298485961335284600 -0.95694978
## rip 0 rdo               0.0000000  0.978298485961335284600 -1.58150591
## stumpjumper            -0.2327217 -0.076729293016571206709  0.85723709
## Trail 429               0.0000000 -0.076729293016571206709  0.55982941
## trance advanced X pro  -0.2327217  0.978298485961335284600  1.60075630
## element                -0.2327217 -0.076729293016571206709  1.00594093
## habit                   0.0000000 -0.076729293016571206709 -0.18368980
## scalpel                 2.7594146 -1.131757071994477614751 -1.67072822
## scalpel se              0.0000000 -0.076729293016571206709 -0.77850517
## reign advanced pro     -1.2301005  0.978298485961335284600  1.48179323
## anthem advanced pro     2.7594146 -0.076729293016571206709 -0.54057902
## rkt 9 rdo               0.0000000 -0.076729293016571206709 -2.97932202
## rkt 9 rdo rs            0.0000000 -0.076729293016571206709 -2.32502512
## megatower               0.0000000  0.000000000000005997139  0.41112557
## tallboy                -0.2327217  0.978298485961335284600  0.41112557
## hightower              -0.2327217 -0.076729293016571206709  0.58957018
## blur                    0.0000000 -1.659270961483430895100 -0.18368980
## blur tr                 0.7646571 -1.131757071994477614751 -0.33239364
## ransom                 -0.2327217  0.978298485961335284600  0.20294019
## spark                   1.7620358 -1.131757071994477614751 -0.18368980
## spark rc                2.7594146 -2.186784850972384397494 -0.37403072
## stumpjumper evo        -0.2327217  0.978298485961335284600  0.70853325
## epic                    1.7620358 -1.131757071994477614751 -1.07591285
## supercaliber            1.7620358 -3.241812629950290958192 -1.37332053
## sb115                  -0.2327217 -0.076729293016571206709 -1.93244698
## sb150                  -0.2327217  0.978298485961335284600 -0.17179349
## sb130                  -0.2327217  0.978298485961335284600 -0.17179349
## jeffsy                 -0.2327217 -0.076729293016571206709  0.41112557
## izzo                   -0.2327217 -2.186784850972384397494  0.70853325
## Capra                  -0.2327217  0.978298485961335284600  0.23268096
## revolver                0.7646571 -0.076729293016571206709  0.88697786
## optic                  -0.7314111  0.978298485961335284600  1.00594093
## sight                  -1.2301005  0.978298485961335284600  1.30334862
## range                  -1.2301005  0.978298485961335284600  1.00594093
## spur                   -0.2327217  0.978298485961335284600 -0.48109748
## sentinel               -1.2301005  0.978298485961335284600 -0.77850517
## Spire                   0.0000000  0.000000000000005997139  0.00000000
## Patrol                  0.0000000  0.000000000000005997139  0.00000000
## ranger                 -1.2301005 -0.076729293016571206709  0.58957018
## rascal                 -1.2301005 -0.076729293016571206709  0.05423635
## rail                   -1.2301005  0.978298485961335284600  0.35164403
## Exie                   -0.2327217 -0.076729293016571206709  0.88697786
## Ripmo                  -0.2327217 -0.076729293016571206709  0.70853325
## Ripley                 -0.2327217 -0.076729293016571206709  0.70853325
## Mach 4 SL               0.0000000 -1.131757071994477614751 -0.18368980
## oiz                     2.2607252 -1.131757071994477614751 -0.42161595
## occam                  -0.2327217 -0.076729293016571206709  0.64905171
##                                          stack                wheelbase
## epic evo              -1.484081463944917578246 -1.022050129479480373718
## top fuel 9.9 xx1 axs  -1.862726361272796227198 -0.926401728985066119648
## Altitude               1.393619755746961397236  1.010478381026824079569
## enduro                 0.000000000000008609388  1.608280884116913611592
## Firebird               1.355755266014173399114  1.428940133189886774190
## rallon                 1.545077714678112945634  1.273511482386463500305
## slash                  0.560600981625627992067  0.855049730223400805684
## Switchblade            0.901381389220718864941  0.209423026886104091115
## fuel ex 9.9           -0.423875751426856905990 -0.268818975585967567810
## genius                -0.389797710667344365909  0.590821023857576843596
## instinct               0.939245878953506752040  1.680017184487724524189
## jet 9 rdo             -0.120959833564553850827 -0.651412577563624917154
## rip 0 rdo              0.030498125366597662877 -0.603588377316417679097
## stumpjumper            0.977110368686294639140  0.508324278431148912638
## Trail 429             -0.423875751426856905990 -0.053610074473535308803
## trance advanced X pro  0.825652409755143090742  0.759401329728986551615
## element                0.787787920022355203642  0.580060578801959603190
## habit                  0.636329961091203766266  0.077906476206284394626
## scalpel               -1.181165546082614481449 -0.759017028119840952982
## scalpel se            -0.423875751426856905990 -0.830753328490651754556
## reign advanced pro     1.090703837884658300439  1.321335682633670627339
## anthem advanced pro   -1.711268402341644678799 -1.261171130715516230936
## rkt 9 rdo              0.030498125366597662877 -2.289391436030470128316
## rkt 9 rdo rs          -1.256894525548190255648 -2.480688237019299080544
## megatower              0.636329961091203766266  0.580060578801959603190
## tallboy                0.181956084297749176582  0.101818576329887972021
## hightower              0.181956084297749176582  0.580060578801959603190
## blur                  -1.408352484479341804047 -1.117698529973894627787
## blur tr               -0.764656159021947834376 -0.562937807106290488690
## ransom                 0.833225307701702444518  1.015260801051545813678
## spark                 -1.075144974830810173927 -0.572502647155734178952
## spark rc              -1.544664647517374644892 -1.151175470146941881566
## stumpjumper evo        1.393619755746961397236  0.962654180779616952535
## epic                  -1.938455340738372001397 -1.404643731457137834084
## supercaliber          -1.711268402341644678799 -2.050270434794434493142
## sb115                 -0.264844894549146059326 -1.249215080653714338155
## sb150                 -0.136105629457672461236  0.393546197837852773649
## sb130                 -0.136105629457672461236 -0.027306764337573546236
## jeffsy                 0.787787920022355203642  0.269203277195113055420
## izzo                   0.181956084297749176582 -0.017741924288129939241
## Capra                  1.317890776281385623037  0.986566280903220516052
## revolver              -1.484081463944917578246 -0.448159726512994405212
## optic                  0.939245878953506752040  0.675708979296373968282
## sight                 -1.029707587151462933051  1.249599382262859936787
## range                  1.847993632540415820387  1.871313985476553032328
## spur                  -0.499604730892432624678 -0.400335526265787278177
## sentinel               0.409143022694476443668  0.627884779049166841247
## Spire                  0.000000000000008609388  0.000000000000005436982
## Patrol                 0.000000000000008609388  0.000000000000005436982
## ranger                 0.181956084297749176582 -0.304687125771372913086
## rascal                 0.106227104832173416260  0.317027477442320237966
## rail                   1.545077714678112945634  0.508324278431148912638
## Exie                  -0.802520648754735721475 -0.113390324782544266169
## Ripmo                  0.863516899487930977841  0.747445279667184658834
## Ripley                 0.409143022694476443668  0.006170175835473645093
## Mach 4 SL             -0.348146771961281131791 -1.117698529973894627787
## oiz                   -1.256894525548190255648 -1.524204232075155651671
## occam                  0.787787920022355203642  0.412675877936734547546
##                              chainstay_length               bb_height
## epic evo               0.97969462494386116980 -0.20971404717286917796
## top fuel 9.9 xx1 axs  -0.27323325110295676454  0.12729903082588428509
## Altitude              -0.00000000000004069755 -0.00000000000000766279
## enduro                 2.41161219756879585674 -0.00000000000000766279
## Firebird               0.80070492836574436168  1.87976703641940234846
## rallon                 1.69565341125632862429  1.00353303362264334453
## slash                  0.26373583863139377081  1.27314349602164611497
## Switchblade           -1.70515082372789161802  1.34054611162139680758
## fuel ex 9.9            0.44272553520951063444  0.53171472442438838524
## genius                 0.62171523178762744255  0.52497446286441185048
## instinct              -0.00000000000004069755 -0.00000000000000766279
## jet 9 rdo             -1.52616112714977480991 -0.00000000000000766279
## rip 0 rdo             -0.09424355452483992868 -0.00000000000000766279
## stumpjumper           -1.16818173399354097164 -0.34451927837237056318
## Trail 429             -1.52616112714977480991  0.59911734002413907785
## trance advanced X pro  0.44272553520951063444 -0.00000000000000766279
## element               -0.00000000000004069755 -0.00000000000000766279
## habit                 -0.09424355452483992868 -0.00750620037361709840
## scalpel                0.26373583863139377081 -1.08594804996962812638
## scalpel se             0.26373583863139377081  0.66651995562388977046
## reign advanced pro     1.33767401810009478602 -0.00000000000000766279
## anthem advanced pro    0.97969462494386116980 -0.00000000000000766279
## rkt 9 rdo              1.33767401810009478602 -0.00000000000000766279
## rkt 9 rdo rs           1.33767401810009478602 -0.00000000000000766279
## megatower             -0.09424355452483992868  0.53171472442438838524
## tallboy               -1.88414052030600842613 -0.54672712517162258550
## hightower             -0.81020234083730735541  0.66651995562388977046
## blur                  -1.16818173399354097164 -1.49036374356813228204
## blur tr                0.19213996000015109988  0.07337693834608680077
## ransom                 0.94389668562822970355  1.87976703641940234846
## spark                  0.97969462494386116980 -1.62516897476763366726
## spark rc              -0.09424355452483992868 -2.63620820876389405640
## stumpjumper evo        0.97969462494386116980  0.12729903082588428509
## epic                  -0.81020234083730735541 -2.02958466836613782291
## supercaliber          -1.88414052030600842613 -2.56880559316414336379
## sb115                  0.51432141384075324986  0.04641589210618039113
## sb150                 -0.81020234083730735541  1.17877983418199661081
## sb130                 -0.81020234083730735541 -0.18275300093297042192
## jeffsy                -0.09424355452483992868  0.66651995562388977046
## izzo                  -1.16818173399354097164 -0.95114281877012674116
## Capra                  0.97969462494386116980  1.34054611162139680758
## revolver              -0.00000000000004069755  0.26210426202538567031
## optic                 -0.00000000000004069755 -0.27711666277261987057
## sight                 -0.00000000000004069755  0.39690949322488705553
## range                 -0.00000000000004069755  2.14937749881840511890
## spur                  -0.09424355452483992868 -0.54672712517162258550
## sentinel               1.69565341125632862429  0.93613041802289254090
## Spire                 -0.00000000000004069755 -0.00000000000000766279
## Patrol                -0.00000000000004069755 -0.00000000000000766279
## ranger                 0.26373583863139377081 -0.14231143157311848535
## rascal                -0.81020234083730735541 -0.54672712517162258550
## rail                   0.26373583863139377081  1.20574088042189542236
## Exie                  -0.09424355452483992868 -0.00000000000000766279
## Ripmo                 -0.09424355452483992868  0.26210426202538567031
## Ripley                -1.16818173399354097164 -0.54672712517162258550
## Mach 4 SL             -1.52616112714977480991 -1.89477943716663643769
## oiz                   -1.88414052030600842613 -1.62516897476763366726
## occam                  1.69565341125632862429 -0.41192189397212125579
##                               standover_height
## epic evo               1.297677652308284024230
## top fuel 9.9 xx1 axs   0.055390762183372951877
## Altitude               2.279951007290772047043
## enduro                 0.000000000000003284457
## Firebird              -1.158005735147935588714
## rallon                 0.517637046881014306621
## slash                  0.286513904532193608432
## Switchblade           -1.085779753163929273185
## fuel ex 9.9            0.373185082913001398008
## genius                 0.516192527241335463728
## instinct               1.846595115386733265694
## jet 9 rdo             -0.999108574783121428098
## rip 0 rdo             -0.796875825227903344938
## stumpjumper            0.373185082913001398008
## Trail 429             -1.634697216242378292606
## trance advanced X pro  0.589863028865020733171
## element                2.106608650529156356868
## habit                  0.979883331578655702998
## scalpel                0.257623511738591048914
## scalpel se             0.633198618055424655715
## reign advanced pro     1.297677652308284024230
## anthem advanced pro    2.337731792877977277101
## rkt 9 rdo              0.084281154976975539150
## rkt 9 rdo rs          -0.233513165752652906981
## megatower             -0.666869057656691688329
## tallboy               -0.869101807211909771489
## hightower             -0.551307486482281339235
## blur                  -0.377965129720665815594
## blur tr                0.269179668856031450996
## ransom                 0.716980757156871484348
## spark                  1.211006473927476401187
## spark rc               0.575417832468219536679
## stumpjumper evo        0.748760189229835004809
## epic                   0.864321760404245353904
## supercaliber           0.690979403642629774751
## sb115                 -0.143952948092484239728
## sb150                 -0.239291244311374745601
## sb130                 -0.294182990619218986961
## jeffsy                -1.013553771179922735612
## izzo                  -0.637978664863089073300
## Capra                 -0.031280416197434809944
## revolver              -0.551307486482281339235
## optic                 -1.100224949560730358655
## sight                 -1.533580841464769140003
## range                 -2.053607911749615766439
## spur                  -1.909155947781602913338
## sentinel              -1.389128877496756286902
## Spire                  0.000000000000003284457
## Patrol                 0.000000000000003284457
## ranger                -1.071334556767127965671
## rascal                -0.580197879275883954264
## rail                  -0.233513165752652906981
## Exie                   0.344294690119398782979
## Ripmo                  0.113171547770578126424
## Ripley                 0.170952333357783287093
## Mach 4 SL             -1.418019270290358901931
## oiz                    0.170952333357783287093
## occam                  0.864321760404245353904
## attr(,"scaled:center")
##      rear_travel      fork_travel         f_piston      f_rotor_dim 
##       128.108696       137.692308         3.384615       186.622222 
##         r_piston      r_rotor_dim       head_angle       seat_angle 
##         3.384615       177.212766        66.175000        75.700000 
##     crank_length      stem_length  handlebar_width            reach 
##       175.666667        52.333333       781.454545       463.088182 
##            stack        wheelbase chainstay_length        bb_height 
##       616.597273      1206.741964       435.263265       339.055682 
## standover_height 
##       736.082727 
## attr(,"scaled:scale")
##      rear_travel      fork_travel         f_piston      f_rotor_dim 
##       22.1163020       22.0537927        0.7635417       12.7048670 
##         r_piston      r_rotor_dim       head_angle       seat_angle 
##        0.7635417       13.2598010        1.7168668        1.1737255 
##     crank_length      stem_length  handlebar_width            reach 
##       12.8327068       10.0262813       18.9568468       16.8119396 
##            stack        wheelbase chainstay_length        bb_height 
##       13.2049845       41.8198316        2.7934569        7.4181098 
## standover_height 
##       34.6135827 
## 
## $modelName
## [1] "XXX"
## 
## $n
## [1] 58
## 
## $d
## [1] 17
## 
## $G
## [1] 1
# get probabilities, means, variances
summary(mtb_gmm2, parameters = TRUE)
## ---------------------------------------------------- 
## Gaussian finite mixture model fitted by EM algorithm 
## ---------------------------------------------------- 
## 
## Mclust XXX (ellipsoidal multivariate normal) model with 1 component: 
## 
##  log-likelihood  n  df      BIC      ICL
##        1095.022 58 170 1499.768 1499.768
## 
## Clustering table:
##  1 
## 58 
## 
## Mixing probabilities:
## 1 
## 1 
## 
## Means:
##                                       [,1]
## rear_travel      -0.0000000000000010855331
## fork_travel       0.0000000000000005545634
## f_piston         -0.0000000000000010381606
## f_rotor_dim      -0.0000000000000007034374
## r_piston         -0.0000000000000010381606
## r_rotor_dim      -0.0000000000000041790108
## head_angle        0.0000000000000013484653
## seat_angle       -0.0000000000000023154629
## crank_length     -0.0000000000000018577082
## stem_length      -0.0000000000000001790994
## handlebar_width   0.0000000000000039486004
## reach             0.0000000000000013751813
## stack             0.0000000000000068490980
## wheelbase         0.0000000000000078192571
## chainstay_length -0.0000000000000365012607
## bb_height        -0.0000000000000083943779
## standover_height  0.0000000000000022679740
## 
## Variances:
## [,,1]
##                  rear_travel fork_travel    f_piston f_rotor_dim    r_piston
## rear_travel       0.98275862  0.86647130  0.53074705  0.72270044  0.53074705
## fork_travel       0.86647130  0.98275862  0.59701027  0.78438697  0.59701027
## f_piston          0.53074705  0.59701027  0.98275862  0.57760629  0.98275862
## f_rotor_dim       0.72270044  0.78438697  0.57760629  0.98275862  0.57760629
## r_piston          0.53074705  0.59701027  0.98275862  0.57760629  0.98275862
## r_rotor_dim       0.77073412  0.79437848  0.43519186  0.74245994  0.43519186
## head_angle       -0.81199232 -0.83055385 -0.44808970 -0.66046683 -0.44808970
## seat_angle        0.59460756  0.63732989  0.36523677  0.56513695  0.36523677
## crank_length     -0.05247594 -0.05329849 -0.01705486 -0.04492137 -0.01705486
## stem_length      -0.52751652 -0.54137826 -0.45331950 -0.37291853 -0.45331950
## handlebar_width   0.61297175  0.66689437  0.53800825  0.56677331  0.53800825
## reach             0.50878091  0.46844618  0.12052159  0.41797347  0.12052159
## stack             0.62986365  0.70353377  0.40627172  0.46370383  0.40627172
## wheelbase         0.81153584  0.80687536  0.36946161  0.65071880  0.36946161
## chainstay_length  0.21765491  0.24627225  0.23496345  0.33487904  0.23496345
## bb_height         0.60876155  0.66944392  0.45592502  0.52235140  0.45592502
## standover_height -0.17884464 -0.08927132 -0.28317481 -0.04107194 -0.28317481
##                  r_rotor_dim    head_angle  seat_angle  crank_length
## rear_travel       0.77073412 -0.8119923156  0.59460756 -0.0524759431
## fork_travel       0.79437848 -0.8305538489  0.63732989 -0.0532984850
## f_piston          0.43519186 -0.4480897037  0.36523677 -0.0170548600
## f_rotor_dim       0.74245994 -0.6604668277  0.56513695 -0.0449213682
## r_piston          0.43519186 -0.4480897037  0.36523677 -0.0170548600
## r_rotor_dim       0.98275862 -0.7644254772  0.63374974 -0.0175895936
## head_angle       -0.76442548  0.9827586207 -0.74721358 -0.0007695164
## seat_angle        0.63374974 -0.7472135761  0.98275862 -0.0512057171
## crank_length     -0.01758959 -0.0007695164 -0.05120572  0.9827586207
## stem_length      -0.39794105  0.5763723220 -0.52789789 -0.0783916344
## handlebar_width   0.56297068 -0.6713014498  0.52755131  0.0926088407
## reach             0.45588325 -0.5810910021  0.57203070 -0.0088706963
## stack             0.59439229 -0.6996862164  0.62242136  0.1205464243
## wheelbase         0.71092923 -0.8998065172  0.72976412 -0.0282440001
## chainstay_length  0.15814975 -0.2217584548  0.06649237 -0.0009586544
## bb_height         0.47593674 -0.5987405494  0.45187614  0.1300968576
## standover_height -0.11335279  0.1344210160 -0.28064197 -0.0271607065
##                  stem_length handlebar_width        reach      stack  wheelbase
## rear_travel      -0.52751652      0.61297175  0.508780910  0.6298637  0.8115358
## fork_travel      -0.54137826      0.66689437  0.468446179  0.7035338  0.8068754
## f_piston         -0.45331950      0.53800825  0.120521586  0.4062717  0.3694616
## f_rotor_dim      -0.37291853      0.56677331  0.417973470  0.4637038  0.6507188
## r_piston         -0.45331950      0.53800825  0.120521586  0.4062717  0.3694616
## r_rotor_dim      -0.39794105      0.56297068  0.455883252  0.5943923  0.7109292
## head_angle        0.57637232     -0.67130145 -0.581091002 -0.6996862 -0.8998065
## seat_angle       -0.52789789      0.52755131  0.572030701  0.6224214  0.7297641
## crank_length     -0.07839163      0.09260884 -0.008870696  0.1205464 -0.0282440
## stem_length       0.98275862     -0.59053686 -0.329975492 -0.6565999 -0.5781065
## handlebar_width  -0.59053686      0.98275862  0.322740937  0.6070998  0.6070346
## reach            -0.32997549      0.32274094  0.982758621  0.4927676  0.6938129
## stack            -0.65659992      0.60709976  0.492767604  0.9827586  0.7492409
## wheelbase        -0.57810653      0.60703461  0.693812924  0.7492409  0.9827586
## chainstay_length -0.10000081      0.34555985 -0.046796458  0.1998316  0.2450669
## bb_height        -0.53601700      0.69945043  0.313913983  0.5873574  0.5877167
## standover_height  0.30985818     -0.22425359 -0.112561218 -0.0762681 -0.0522580
##                  chainstay_length  bb_height standover_height
## rear_travel          0.2176549122  0.6087615      -0.17884464
## fork_travel          0.2462722471  0.6694439      -0.08927132
## f_piston             0.2349634516  0.4559250      -0.28317481
## f_rotor_dim          0.3348790372  0.5223514      -0.04107194
## r_piston             0.2349634516  0.4559250      -0.28317481
## r_rotor_dim          0.1581497490  0.4759367      -0.11335279
## head_angle          -0.2217584548 -0.5987405       0.13442102
## seat_angle           0.0664923694  0.4518761      -0.28064197
## crank_length        -0.0009586544  0.1300969      -0.02716071
## stem_length         -0.1000008062 -0.5360170       0.30985818
## handlebar_width      0.3455598514  0.6994504      -0.22425359
## reach               -0.0467964577  0.3139140      -0.11256122
## stack                0.1998316255  0.5873574      -0.07626810
## wheelbase            0.2450668561  0.5877167      -0.05225800
## chainstay_length     0.9827586207  0.3448505       0.29091329
## bb_height            0.3448504748  0.9827586      -0.20756940
## standover_height     0.2909132943 -0.2075694       0.98275862
plot(mtb_gmm2, 'classification')

Multi-class SVM

Conclusions/Findings